/**
 * 网络请求工具类
 */
import axios from 'axios';

// 判断环境
const isDev = import.meta.env.DEV;
const baseURL = import.meta.env.VITE_API_BASE_URL || '';
console.log('当前环境:', isDev ? '开发环境' : '生产环境');
console.log('API基础URL:', baseURL || '使用相对路径');

// 创建axios实例
const api = axios.create({
  baseURL,
  timeout: 10000, // 请求超时10秒
  headers: {
    'Content-Type': 'application/json',
  }
});

/**
 * 重试函数 - 在网络请求失败后进行重试
 * @param {Function} fn - 要重试的异步函数
 * @param {Number} retriesLeft - 剩余重试次数
 * @param {Number} interval - 重试间隔(毫秒)
 */
export const retry = (fn, retriesLeft = 3, interval = 1000) => {
  return new Promise((resolve, reject) => {
    fn()
      .then(resolve)
      .catch((error) => {
        console.log(`请求失败，剩余重试次数: ${retriesLeft}`);
        
        if (retriesLeft === 0) {
          reject(error);
          return;
        }
        
        setTimeout(() => {
          retry(fn, retriesLeft - 1, interval)
            .then(resolve)
            .catch(reject);
        }, interval);
      });
  });
};

/**
 * 为API路径添加前缀
 * @param {String} path - API路径
 * @returns {String} - 完整API路径
 */
export const getApiUrl = (path) => {
  // 确保path以/开头
  if (!path.startsWith('/')) {
    path = '/' + path;
  }
  
  // 如果path不包含/api前缀，则添加
  if (!path.startsWith('/api/')) {
    path = '/api' + path;
  }
  
  // 在开发环境中，我们使用相对路径，让Vite的代理处理它
  // 在生产环境中，我们使用完整的URL
  return path;
};

/**
 * 登录请求
 * @param {Object} data - 登录数据
 * @returns {Promise} - 返回响应
 */
export const login = (data) => {
  console.log('使用工具类发送登录请求');
  
  const loginUrl = getApiUrl('/login');
  console.log('登录URL:', loginUrl);
  
  // 多种方法尝试登录
  return retry(async () => {
    try {
      // 尝试使用axios
      console.log('尝试使用axios登录');
      const axiosResponse = await api.post(loginUrl, data);
      console.log('axios登录成功');
      return axiosResponse;
    } catch (axiosError) {
      console.error('axios登录失败:', axiosError.message);
      
      // 尝试使用原生fetch - 使用相同的URL策略
      console.log('尝试使用fetch登录');
      
      // 构建fetch URL - 和axios使用同样的逻辑
      const fetchUrl = loginUrl;
      
      const fetchResponse = await fetch(fetchUrl, {
        method: 'POST',
        headers: {
          'Content-Type': 'application/json'
        },
        body: JSON.stringify(data),
        mode: 'cors'
      });
      
      if (!fetchResponse.ok) {
        throw new Error(`Fetch请求失败 ${fetchResponse.status}`);
      }
      
      const jsonData = await fetchResponse.json();
      console.log('fetch登录成功');
      
      // 转换为axios响应格式
      return {
        data: jsonData,
        status: fetchResponse.status,
        statusText: fetchResponse.statusText
      };
    }
  }, 2);
};

// 添加请求拦截器
api.interceptors.request.use(
  config => {
    // 在请求发送前添加认证信息
    const token = localStorage.getItem('token');
    if (token) {
      config.headers.Authorization = `Bearer ${token}`;
    }
    return config;
  },
  error => {
    return Promise.reject(error);
  }
);

// 添加响应拦截器
api.interceptors.response.use(
  response => {
    return response;
  },
  error => {
    // 处理401错误 (未授权)
    if (error.response && error.response.status === 401) {
      console.error('身份验证失败，请重新登录');
      localStorage.removeItem('token');
      localStorage.removeItem('user');
      window.location.href = '/';
    }
    return Promise.reject(error);
  }
);

// 导出axios实例，方便直接使用
export default {
  api,
  retry,
  login,
  getApiUrl
}; 